package cn.itcast.tools;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.itcast.dto.AreaDTO;
import cn.itcast.dto.WeatherDTO;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.util.UriUtils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


@Service
public class SearchHttpAKService {


    @Tool(description = "行政区划区域检索")
    public List<AreaDTO> getArea(@ToolParam(description = "检索关键字") String query,
                                    @ToolParam(description = "检索分类偏好") String tag,
                                    @ToolParam(description = "检索行政区划区域") String region,
                                    @ToolParam(description = "输出格式为json或者xml") String output) {
        // 通过http请求获取天气信息，并且通过json数据解析为WeatherDTO对象
        String strUrl = "https://api.map.baidu.com/place/v2/search?";
        String AK = "OYPPz3e225IDT3Q0ti1I3rVI5YWc6dN3";
        Map<String, String> params = new LinkedHashMap<String, String>();
        params.put("query", query);
        params.put("tag", tag);
        params.put("region", region);
        params.put("output", output);
        params.put("ak", AK);
        StringBuffer queryString = new StringBuffer();
        queryString.append(strUrl);
        for (Map.Entry<?, ?> pair : params.entrySet()) {
            queryString.append(pair.getKey() + "=");
            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
        }
        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }
        String data = HttpUtil.get(queryString.toString());
        // 创建HttpRequest对象
        HttpRequest request = HttpUtil.createGet(queryString.toString());

        // 设置HTTP版本为1.0
        request.header("Connection", "close"); // HTTP 1.0 需要显式关闭连接
        request.header("Content-Length", "0"); // 对于某些服务器，需要Content-Length头部，尽管它是0

        // 执行请求
        HttpResponse response = request.execute();
        JSONObject jsonObject = JSONUtil.parseObj(data);

        return List.of(AreaDTO.builder()
                .name(jsonObject.getByPath("results.name", String.class)) // 地址名称
                .location(jsonObject.getByPath("results.location", String.class)) // 经纬度
                .address(jsonObject.getByPath("results.address", String.class))// 详细地址
                .province(jsonObject.getByPath("results.province", String.class))   // 省
                .city(jsonObject.getByPath("results.city", String.class))  // 市
                .area(jsonObject.getByPath("results.area", String.class))  // 区
                .detail(jsonObject.getByPath("results.detail", Integer.class))  //细节
                .uid(jsonObject.getByPath("results.uid", String.class))// PM2.5数值
                .build());
    }
}
